﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using VentaPorCatalogos.UserControls;
using BE.SearchCriteria;
using BE;
using BLL;
using System.IO;
using VentaPorCatalogos.Common;
using BLL.Exceptions;
using VentaPorCatalogos.Models;

namespace VentaPorCatalogos.Pages
{
    public partial class Articulos : VentaPorCatalogos.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ViewState.Add("FormBehavior", behavior.Initial);
                Session["SearchCriteria"] = null;
                Session["Model"] = null;

                CargarRubros();
            }
        }

        protected void Page_PreRender(object sender, EventArgs e)
        {
            ConfigurarFormBehaviour();
        }

        private void CargarRubros()
        {
            try
            {
                int wCountReg = 0;
                List<RubroBE> ListRubroBE = new List<RubroBE>();
                ListRubroBE = RubroBLL.SeleccionarTodos(null, 0, null, ref wCountReg);
                ddlRubro.DataSource = ListRubroBE;
                ddlRubro.DataTextField = "Descripcion";
                ddlRubro.DataValueField = "IdRubro";
                ddlRubro.DataBind();

                ddlRubro.Items.Insert(0, new ListItem("Seleccione", string.Empty));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected void botComandos_OnBotonClick(object sender, BotoneraEventArgs e)
        {
            try
            {
                ArticulosModel oArticulosModel;
                ArticuloBE oArticuloBE;
                behavior wComportamiento;

                switch (e.Boton)
                {
                    case BotonesTipos.Buscar:
                        if (BuscarElemento())
                            SetFormBehaviour(behavior.View);
                        else
                            e.CancelarOperacion = true;  // Evita que la botonera pase a modo consulta, si no se encontró un elemento.                        
                        break;

                    case BotonesTipos.Nuevo:
                        SetFormBehaviour(behavior.New);
                        oArticulosModel = new ArticulosModel();
                        oArticuloBE = new ArticuloBE();
                        oArticulosModel.Articulo = oArticuloBE;
                        SetModel<ArticulosModel>(oArticulosModel);

                        HabilitarControles(true, divCampos.Controls);
                        BlanquearControles(divCampos.Controls);
                        break;

                    case BotonesTipos.Editar:
                        SetFormBehaviour(behavior.Edit);
                        HabilitarControles(true, divCampos.Controls);
                        break;

                    case BotonesTipos.Eliminar:
                        oArticulosModel = GetModel<ArticulosModel>();
                        ArticuloBLL.Delete(oArticulosModel.Articulo.IdArticulo);
                        SetModel<ArticulosModel>(null);
                        SetFormBehaviour(behavior.Initial);
                        break;

                    case BotonesTipos.Aceptar:
                        wComportamiento = GetFormBehaviour();
                        // Como no sabemos si va a haber algun error, evitamos q se cambie el estado de la botonera.
                        e.CancelarOperacion = true;

                        oArticulosModel = GetModel<ArticulosModel>();
                        oArticuloBE = oArticulosModel.Articulo;
                        LeerDatosDesdeControles(oArticuloBE);

                        switch (wComportamiento)
                        {
                            case behavior.New:
                                ArticuloBLL.Insertar(oArticuloBE);
                                hidIdElemento.Value = oArticuloBE.IdArticulo.ToString();
                                BuscarElemento();
                                MostrarMensaje("Artículo registrado correctamente");
                                break;
                            case behavior.Edit:
                                ArticuloBLL.Modificar(oArticuloBE, oArticulosModel.AccionesList);
                                MostrarMensaje("Artículo modificado correctamente");
                                break;
                        }
                        SetFormBehaviour(behavior.View);
                        // Si llega hasta aqui no hubo ningun error, cambiar el estado de la botonera
                        e.CancelarOperacion = false;
                        break;

                    case BotonesTipos.Cancelar:
                        wComportamiento = GetFormBehaviour();
                        switch (wComportamiento)
                        {
                            case behavior.Edit:
                                BuscarElemento();
                                SetFormBehaviour(behavior.View);
                                break;
                            case behavior.New:
                                BlanquearControles(divCampos.Controls);
                                SetFormBehaviour(behavior.Initial);
                                break;
                            default:
                                break;
                        }
                        break;

                    default:
                        break;
                }
            }
            catch (BLLException bllEx)
            {
                MostrarMensaje(bllEx.Message);
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void ConfigurarFormBehaviour()
        {
            behavior wComportamiento;
            wComportamiento = GetFormBehaviour();
            switch (wComportamiento)
            {
                case behavior.Initial:
                    HabilitarControles(false, divCampos.Controls);
                    break;

                case behavior.New:
                    CargarGrillaPresentaciones();
                    break;

                case behavior.Edit:
                    CargarGrillaPresentaciones();
                    break;

                case behavior.View:
                    HabilitarControles(false, divCampos.Controls);
                    break;
            }
        }

        private bool BuscarElemento()
        {
            try
            {
                int id;
                if (!int.TryParse(hidIdElemento.Value, out id))
                    return false;

                ArticuloBE oArticuloBE = ArticuloBLL.SeleccionarPorId(id);
                if (oArticuloBE == null)
                    return false;

                ArticulosModel oArticulosModel = new ArticulosModel();
                oArticulosModel.Articulo = oArticuloBE;
                SetModel<ArticulosModel>(oArticulosModel);

                // Mostrar datos del Articulo
                lblIdArticulo.Text = oArticuloBE.IdArticulo.ToString();
                txtNombre.Text = oArticuloBE.Nombre;
                txtDescripcion.Text = oArticuloBE.Descripcion;
                txtPrecio.Text = String.Format("{0:0.00}", oArticuloBE.Precio);
                if (oArticuloBE.Rubro != null)
                    ddlRubro.SelectedValue = oArticuloBE.Rubro.IdRubro.ToString();
                chkActivo.Checked = oArticuloBE.Activo;

                imgImagen.ImageUrl = string.Format("~/Imagen.ashx?Origen=Articulo&Distinct={0}", oArticuloBE.IdArticulo.ToString());

                CargarGrillaPresentaciones();

                return true;
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void LeerDatosDesdeControles(ArticuloBE oArticuloBE)
        {
            int resultado;
            if (int.TryParse(lblIdArticulo.Text, out resultado))
                oArticuloBE.IdArticulo = resultado;
            oArticuloBE.Nombre = txtNombre.Text;
            oArticuloBE.Descripcion = txtDescripcion.Text;
            oArticuloBE.Rubro.IdRubro = int.Parse(ddlRubro.SelectedValue);
            oArticuloBE.Activo = chkActivo.Checked;
            oArticuloBE.Precio = decimal.Parse(txtPrecio.Text);

            // La imagen y las presentaciones ya estan seteadas

        }

        protected void btnImagen_Click(object sender, EventArgs e)
        {
            //if (fuImagen.PostedFile == null)
            //    return;

            //if (fuImagen.PostedFile.ContentType != "image/jpeg")
            //{                
            //    MostrarMensaje("Sólo se admiten imágenes de tipo JPEG.");
            //    return;
            //}

            //if (!fuImagen.HasFile)
            //{
            //    MostrarMensaje("No se ha subido una imagen.");
            //    return;
            //}

            try
            {
                //string filename = Path.GetFileName(fuImagen.FileName);
                //string wFullFileName = Server.MapPath("~/Images/UploadedImages/") + filename;

                //fuImagen.SaveAs(wFullFileName);
                ////lblImagenStatus.Text = "Imagen subida.";

                //ArticulosModel oArticulosModel = GetModel<ArticulosModel>();
                //ArticuloBE oArticuloBE = oArticulosModel.Articulo;
                //oArticuloBE.Imagen = fuImagen.FileBytes;

                //SetModel<ArticulosModel>(oArticulosModel);

                //imgImagen.ImageUrl = "~/Images/UploadedImages/" + filename;
                imgImagen.ImageUrl = "~/Imagen.ashx?Origen=Articulo";
            }
            catch (Exception)
            {
                //MostrarMensaje("La imagen no pudo ser subida.");
            }
        }


        protected void gdvPresentaciones_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gdvPresentaciones.EditIndex = e.NewEditIndex;

            botComandos.Enabled = false;
        }

        protected void gdvPresentaciones_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int wIdPresentacion = int.Parse(e.Keys[0].ToString());

            // Descripción
            if (e.NewValues.Count >= 1)
            {
                ArticulosModel oArticulosModel = GetModel<ArticulosModel>();
                ArticuloBE oArticuloBE = oArticulosModel.Articulo;
                PresentacionBE oPresentacionBE;
                //int wNewId = 0;
                //if (!int.TryParse(e.NewValues[0].ToString(), out wNewId))
                //{
                //    e.Cancel = true;
                //    MostrarMensaje("Debe ingresar un código de presentación.");
                //    return;
                //}
                // Si cambia el id de presentación, validar que no exista
                //if (wIdPresentacion != wNewId)
                //{
                //    oPresentacionBE = oArticuloBE.Presentaciones.Find(x => x.IdPresentacion == wNewId);
                //    if (oPresentacionBE != null)
                //    {
                //        e.Cancel = true;
                //        MostrarMensaje("El código de presentación ingresado ya existe.");
                //        return;
                //    }
                //    oPresentacionBE = null;
                //}
                if (e.NewValues[0] == null || string.IsNullOrEmpty(e.NewValues[0].ToString()))
                {
                    e.Cancel = true;
                    MostrarMensaje("Debe ingresar una descripción de la presentación.");
                    return;
                }

                oPresentacionBE = oArticuloBE.Presentaciones.Find(x => x.IdPresentacion == wIdPresentacion);
                if (oPresentacionBE != null)
                {
                    //oPresentacionBE.IdPresentacion = int.Parse(e.NewValues[0].ToString());
                    oPresentacionBE.Descripcion = e.NewValues[0].ToString();
                    oArticulosModel.AccionesList.EditarElemento(oPresentacionBE.IdPresentacion);
                }
                SetModel<ArticulosModel>(oArticulosModel);
            }

            gdvPresentaciones.EditIndex = -1;
            botComandos.Enabled = true;

        }

        protected void gdvPresentaciones_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            int wIdPresentacion = int.Parse(e.Keys[0].ToString());

            ArticulosModel oArticulosModel = GetModel<ArticulosModel>();
            ArticuloBE oArticuloBE = oArticulosModel.Articulo;
            PresentacionBE oPresentacionBE;

            oPresentacionBE = oArticuloBE.Presentaciones.Find(x => x.IdPresentacion == wIdPresentacion);
            if (oPresentacionBE != null)
            {
                oArticuloBE.Presentaciones.Remove(oPresentacionBE);
                oArticulosModel.AccionesList.QuitarElemento(oPresentacionBE.IdPresentacion);
            }
            SetModel<ArticulosModel>(oArticulosModel);

        }

        protected void gdvPresentaciones_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gdvPresentaciones.EditIndex = -1;
            botComandos.Enabled = true;
        }


        private void CargarGrillaPresentaciones()
        {
            ArticulosModel oArticulosModel = GetModel<ArticulosModel>();
            ArticuloBE oArticuloBE = oArticulosModel.Articulo;
            gdvPresentaciones.DataSource = oArticuloBE.Presentaciones;
            gdvPresentaciones.DataBind();

        }

        protected void btnAgregarPresentacion_Click(object sender, EventArgs e)
        {
            ArticulosModel oArticulosModel = GetModel<ArticulosModel>();
            ArticuloBE oArticuloBE = oArticulosModel.Articulo;

            int wIdPresentacionMaximo = 0;
            
            if (oArticuloBE.Presentaciones.Count > 0)
                wIdPresentacionMaximo =  oArticuloBE.Presentaciones.Max(x => x.IdPresentacion);

            PresentacionBE oPresentacionBE = new PresentacionBE();
            oPresentacionBE.IdPresentacion = wIdPresentacionMaximo + 1;            
            oPresentacionBE.IdArticulo = oArticuloBE.IdArticulo;
            oPresentacionBE.Descripcion = string.Empty;
            oArticuloBE.Presentaciones.Add(oPresentacionBE);
            oArticulosModel.AccionesList.AgregarElemento(oPresentacionBE.IdPresentacion);

            SetModel<ArticulosModel>(oArticulosModel);

            CargarGrillaPresentaciones();
            
            if (gdvPresentaciones.DataKeys.Count > 0)            
                gdvPresentaciones_RowEditing(null, new GridViewEditEventArgs(gdvPresentaciones.DataKeys.IndexOf(oPresentacionBE.IdPresentacion)));
                //gdvPresentaciones.EditIndex = gdvPresentaciones.DataKeys.IndexOf(oPresentacionBE.IdPresentacion);

            
        }

    }
}